import sys
from PyQt5.QtWidgets import QApplication,QMainWindow
import main_window
import socket
import threading

connect_num = 0
clientID = []


def socket_recv(dataSocket):
    global connect_num
    while True:
        if connect_num > 0:
            # 尝试读取对方发送的消息
            # BUFLEN 指定从接收缓冲里最多读取多少字节
            recved = dataSocket.recv(256)

            # 如果返回空bytes，表示对方关闭了连接
            # 退出循环，结束消息收发
            if not recved:
                continue

            # 读取的字节数据是bytes类型，需要解码为字符串
            info = recved.decode()
            print(f'收到对方信息： {info}')

            # 发送的数据类型必须是bytes，所以要编码
            dataSocket.send(f'服务端接收到了信息 {info}'.encode())

def socket_listen(listenSocket):
    while True:
        dataSocket, addr = listenSocket.accept()
        print('接受一个客户端连接:', addr)
        connect_num = connect_num + 1  #连接数加一
        clientID.append(dataSocket)
        socketrecv = threading.Thread(target=socket_recv)
        socketrecv.start()

if __name__ == "__main__":
    # 创建一个QApplication类的实例
    app = QApplication(sys.argv)
    # 创建一个窗口类
    mw = QMainWindow()
    # 获取到一个UI
    ui = main_window.Ui_MainWindow()
    # 将UI显示到窗口上
    ui.setupUi(mw)
    # 窗口显示
    mw.show()
    # 进入程序的主循环、并通过exit函数确保主循环安全结束
    # sys.exit(app.exec())

    # 主机地址为空字符串，表示绑定本机所有网络接口ip地址
    # 等待客户端来连接
    IP = '127.0.0.1'
    # 端口号
    PORT = 60000
    # 定义一次从socket缓冲区最多读入512个字节数据
    BUFLEN = 512

    # 实例化一个socket对象
    # 参数 AF_INET 表示该socket网络层使用IP协议
    # 参数 SOCK_STREAM 表示该socket传输层使用TCP协议
    listenSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # socket绑定地址和端口
    listenSocket.bind((IP, PORT))

    # 使socket处于监听状态，等待客户端的连接请求
    # 参数表示 最多接受多少个等待连接的客户端
    listenSocket.listen(20)
    print(f'服务端启动成功，在{PORT}端口等待客户端连接...')

    # socketlisten = threading.Thread(target=socket_listen)
    # socketlisten.start()

    # while True:
    #     dataSocket, addr = listenSocket.accept()
    #     print('接受一个客户端连接:', addr)
    #     connect_num = connect_num + 1  #连接数加一
    #     clientID.append(dataSocket)
    #     socketrecv = threading.Thread(target=socket_recv,args=(dataSocket))
    #     socketrecv.start()

    print('执行到最后')

    # # 服务端也调用close()关闭socket
    # dataSocket.close()
    listenSocket.close()




